﻿using System;
using System.Collections.Specialized;
using System.Configuration.Provider;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Configuration;
using System.Web.Security;
using ALinq.Mapping;
using System.IO;

namespace ALinq.BBS.DataAccess
{
    //public class MembershipProvider : System.Web.Security.MembershipProvider
    //{
    //    private string _AppName;
    //    //private readonly Table<User> userTable;
    //    //private readonly string path;
    //    private Database dataContext;
    //    private int _SchemaVersionCheck;
    //    private bool _EnablePasswordRetrieval;
    //    private bool _EnablePasswordReset;
    //    private bool _RequiresQuestionAndAnswer;
    //    private bool _RequiresUniqueEmail;
    //    private int _MaxInvalidPasswordAttempts;
    //    private int _PasswordAttemptWindow;
    //    private int _MinRequiredNonalphanumericCharacters;
    //    private int _MinRequiredPasswordLength;
    //    private string _PasswordStrengthRegularExpression;
    //    private int _CommandTimeout;
    //    //private MembershipPasswordFormat _PasswordFormat;
    //    private string mappingFile;
    //    private string conn;
    //    string listenerName;

    //    public MembershipProvider()
    //    {
    //        //path = "C:/Membership.mdb";
    //        //userTable = DataConext.GetTable<User>();
    //    }

    //    public override void Initialize(string name, NameValueCollection config)
    //    {
    //        base.Initialize(name, config);

    //        if (config == null)
    //        {
    //            throw new ArgumentNullException("config");
    //        }
    //        #region MyRegion
    //        /*
    //        if (string.IsNullOrEmpty(name))
    //        {
    //            name = "ALinqMembershipProvider";
    //        }
    //        if (string.IsNullOrEmpty(config["description"]))
    //        {
    //            config.Remove("description");
    //            config.Add("description", SR.GetString("MembershipSqlProvider_description"));
    //        }
    //        */

    //        #endregion

    //        var connName = config["connectionStringName"];
    //        if (string.IsNullOrEmpty(connName))
    //        {
    //            throw new ArgumentNullException("connectionStringName");
    //        }
    //        var setting = WebConfigurationManager.ConnectionStrings[connName];
    //        if (setting == null)
    //        {
    //            throw new Exception(string.Format("找不到名为“{0}”连接字符串", connName));
    //        }
    //        conn = setting.ConnectionString;

    //        ApplicationName = config["applicationName"];
    //        if (string.IsNullOrEmpty(ApplicationName))
    //        {
    //            ApplicationName = SecUtility.GetDefaultAppName();
    //        }

    //        this._SchemaVersionCheck = 0;
    //        this._EnablePasswordRetrieval = SecUtility.GetBooleanValue(config, "enablePasswordRetrieval", false);
    //        this._EnablePasswordReset = SecUtility.GetBooleanValue(config, "enablePasswordReset", true);
    //        this._RequiresQuestionAndAnswer = SecUtility.GetBooleanValue(config, "requiresQuestionAndAnswer", true);
    //        this._RequiresUniqueEmail = SecUtility.GetBooleanValue(config, "requiresUniqueEmail", true);
    //        this._MaxInvalidPasswordAttempts = SecUtility.GetIntValue(config, "maxInvalidPasswordAttempts", 5, false, 0);
    //        this._PasswordAttemptWindow = SecUtility.GetIntValue(config, "passwordAttemptWindow", 10, false, 0);
    //        this._MinRequiredPasswordLength = SecUtility.GetIntValue(config, "minRequiredPasswordLength", 7, false, 0x80);
    //        this._MinRequiredNonalphanumericCharacters = SecUtility.GetIntValue(config, "minRequiredNonalphanumericCharacters", 1, true, 0x80);
    //        this._PasswordStrengthRegularExpression = config["passwordStrengthRegularExpression"];

    //        this.mappingFile = config["mappingFile"];

    //        listenerName = config["listenerName"];
    //    }

    //    internal User GetUser(string name)
    //    {
    //        var db = CreateDataContext();
    //        try
    //        {
    //            var item = db.Users.Where(o => o.Name == name).SingleOrDefault();
    //            return item;
    //        }
    //        finally
    //        {
    //            if (db.Log != null)
    //                db.Log.Flush();
    //        }
    //    }

    //    public override string ApplicationName
    //    {
    //        get;
    //        set;
    //    }

    //    public override bool ChangePassword(string username, string oldPassword, string newPassword)
    //    {
    //        var db = CreateDataContext();
    //        var user = db.Users.Where(o => o.Name == username).SingleOrDefault();
    //        if (user != null && string.Equals(oldPassword, user.Password, StringComparison.OrdinalIgnoreCase))
    //        {
    //            user.Password = newPassword;
    //            dataContext.SubmitChanges();
    //            return true;
    //        }
    //        return false;
    //    }

    //    public override bool ChangePasswordQuestionAndAnswer(string username, string password,
    //                                                         string newPasswordQuestion, string newPasswordAnswer)
    //    {
    //        var db = CreateDataContext();
    //        db.Connection.Open();
    //        try
    //        {
    //            var user = db.Users.Where(o => o.Name == username & o.Password == password).SingleOrDefault();
    //            if (user == null)
    //                return false;

    //            var questionID = db.PasswordQuestions.Where(o => o.Text == newPasswordQuestion)
    //                                     .Select(o => o.ID)
    //                                     .Single();

    //            user.PasswordQuestionID = questionID;
    //            user.PasswordAnswer = newPasswordAnswer;
    //            db.SubmitChanges();
    //            return true;
    //        }
    //        finally
    //        {
    //            db.Connection.Close();
    //            if (db.Log != null)
    //                db.Log.Flush();
    //        }
    //    }

    //    public override MembershipUser CreateUser(string username, string password,
    //                                              string email, string passwordQuestion, string passwordAnswer, bool isApproved,
    //                                              object providerUserKey, out MembershipCreateStatus status)
    //    {
    //        var user = new User();

    //        if (providerUserKey != null)
    //            user.ID = (int)providerUserKey;

    //        var db = CreateDataContext();

    //        user.Name = username;
    //        user.Password = password;
    //        user.Email = email;
    //        user.PasswordQuestionID = db.PasswordQuestions.Where(o => o.Text == passwordAnswer)
    //                                                      .Select(o => o.ID)
    //                                                      .Single(); //.SetPasswordQuestion(passwordQuestion);
    //        user.PasswordAnswer = passwordAnswer;

    //        try
    //        {
    //            db.Users.InsertOnSubmit(user);
    //            DataConext.SubmitChanges();
    //            status = MembershipCreateStatus.Success;
    //            return user;
    //        }
    //        catch
    //        {
    //            status = MembershipCreateStatus.ProviderError;
    //            return null;
    //        }
    //        finally
    //        {
    //            if (db.Log != null)
    //                db.Log.Flush();
    //        }
    //    }

    //    public override bool DeleteUser(string username, bool deleteAllRelatedData)
    //    {
    //        var db = CreateDataContext();
    //        var user = db.Users.Where(o => o.Name == username).SingleOrDefault();
    //        if (user == null)
    //            return false;

    //        try
    //        {
    //            db.Users.DeleteOnSubmit(user);
    //            dataContext.SubmitChanges();
    //            return true;
    //        }
    //        catch (Exception exc)
    //        {
    //            Utility.LogError(exc);
    //            return false;
    //        }
    //    }

    //    public override bool EnablePasswordReset
    //    {
    //        get { return this._EnablePasswordReset; }
    //    }

    //    public override bool EnablePasswordRetrieval
    //    {
    //        get { return this._EnablePasswordRetrieval; }
    //    }

    //    public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
    //    {
    //        var db = CreateDataContext();
    //        totalRecords = db.Users.Where(o => o.Email.Contains(emailToMatch)).Count();

    //        var skip = (pageIndex * pageIndex);
    //        var take = pageSize;

    //        var users = db.Users.Where(o => o.Email.Contains(emailToMatch)).Skip(skip).Take(take).ToArray();

    //        var result = new MembershipUserCollection();
    //        foreach (var user in users)
    //            result.Add(user);
    //        return result;
    //    }

    //    public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
    //    {
    //        var db = CreateDataContext();
    //        totalRecords = db.Users.Where(o => o.Name.Contains(usernameToMatch)).Count();

    //        var skip = (pageIndex * pageIndex);
    //        var take = pageSize;

    //        var users = db.Users.Where(o => o.Name.Contains(usernameToMatch)).Skip(skip).Take(take).ToArray();

    //        var result = new MembershipUserCollection();
    //        foreach (var user in users)
    //            result.Add(user);
    //        return result;
    //    }

    //    public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
    //    {
    //        var db = CreateDataContext();
    //        var items = new MembershipUserCollection();
    //        totalRecords = db.Users.Count();

    //        var skip = (pageIndex * pageIndex);
    //        var take = pageSize;

    //        var num = totalRecords - skip;
    //        if (num < pageSize)
    //            take = num;

    //        var users = db.Users.Skip(skip).Take(take).ToList();

    //        foreach (var user in users)
    //            items.Add(user);

    //        return items;
    //    }

    //    public override int GetNumberOfUsersOnline()
    //    {
    //        throw new NotImplementedException();
    //    }

    //    public override string GetPassword(string username, string answer)
    //    {
    //        var db = CreateDataContext();
    //        var user = db.Users.Where(o => o.Name == username && o.PasswordAnswer == answer)
    //            .Select(o => o.Password).SingleOrDefault();
    //        return user;
    //    }

    //    public override MembershipUser GetUser(string username, bool userIsOnline)
    //    {
    //        var db = CreateDataContext();
    //        try
    //        {
    //            return db.Users.Where(o => o.Name == username).SingleOrDefault();
    //        }
    //        finally
    //        {
    //            db.Log.Flush();
    //        }
    //    }

    //    public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
    //    {
    //        var db = CreateDataContext();
    //        return db.Users.Where(o => o.ID == (int)providerUserKey).SingleOrDefault();
    //    }

    //    public override string GetUserNameByEmail(string email)
    //    {
    //        var db = CreateDataContext();
    //        return db.Users.Where(o => string.Equals(email, o.Email, StringComparison.OrdinalIgnoreCase))
    //            .Select(o => o.Name).FirstOrDefault();
    //    }

    //    public override int MaxInvalidPasswordAttempts
    //    {
    //        get { return this._MaxInvalidPasswordAttempts; }
    //    }

    //    public override int MinRequiredNonAlphanumericCharacters
    //    {
    //        get { return this._MinRequiredNonalphanumericCharacters; }
    //    }

    //    public override int MinRequiredPasswordLength
    //    {
    //        get { return this._MinRequiredPasswordLength; }
    //    }

    //    public override int PasswordAttemptWindow
    //    {
    //        get { return this._PasswordAttemptWindow; }
    //    }

    //    public override MembershipPasswordFormat PasswordFormat
    //    {
    //        get { return MembershipPasswordFormat.Clear; }
    //    }

    //    public override string PasswordStrengthRegularExpression
    //    {
    //        get { return this._PasswordStrengthRegularExpression; }
    //    }

    //    public override bool RequiresQuestionAndAnswer
    //    {
    //        get { return this._RequiresQuestionAndAnswer; }
    //    }

    //    public override bool RequiresUniqueEmail
    //    {
    //        get { return _RequiresUniqueEmail; }
    //    }

    //    public override string ResetPassword(string username, string answer)
    //    {
    //        var db = CreateDataContext();
    //        db.Connection.Open();
    //        try
    //        {
    //            var user = db.Users.Where(o => o.Name == username).SingleOrDefault();
    //            if (user != null && user.PasswordAnswer == answer)
    //            {
    //                var random = new Random(1000);
    //                var password = random.Next(10000000, Int32.MaxValue).ToString();
    //                user.Password = password;
    //                db.SubmitChanges();
    //                return password;
    //            }
    //            return null;
    //        }
    //        finally
    //        {
    //            db.Connection.Close();
    //        }
    //    }

    //    private Database CreateDataContext()
    //    {
    //        var db = mappingFile != null ? new Database(conn, XmlMappingSource.FromUrl(mappingFile)) 
    //                                     : new Database(conn);

    //        if (listenerName != null)
    //        {
    //            var listener = Trace.Listeners[listenerName] as TextWriterTraceListener;
    //            if (listener != null)
    //                db.Log = listener.Writer;
    //        }
    //        return db;
    //    }

    //    public override bool UnlockUser(string userName)
    //    {
    //        var db = CreateDataContext();
    //        var user = db.Users.Where(o => o.Name == userName).SingleOrDefault();
    //        if (user == null)
    //            return false;
    //        user.IsLocked = false;
    //        try
    //        {
    //            DataConext.SubmitChanges();
    //            return true;
    //        }
    //        catch (Exception exc)
    //        {
    //            Utility.LogError(exc);
    //            return false;
    //        }
    //    }

    //    public override void UpdateUser(MembershipUser user)
    //    {
    //        var db = CreateDataContext();
    //        db.Users.Attach((User)user);
    //        DataConext.SubmitChanges();
    //    }

    //    public override bool ValidateUser(string username, string password)
    //    {
    //        var db = CreateDataContext();
    //        var pwd = db.Users.Where(o => o.Name == username).Select(o => o.Password).SingleOrDefault();
    //        return pwd == password;
    //    }

    //    private Database DataConext
    //    {
    //        get
    //        {
    //            if (dataContext == null)
    //                dataContext = CreateDataContext();
    //            return dataContext;
    //        }
    //    }
    //}
}